package v1

import (
	"hr/api/dto"
	"hr/api/middleware"
	"hr/db"
	"hr/utils"

	"github.com/gin-gonic/gin"
	"github.com/spf13/cast"
)

// GetUser
// @Summary 获取所有用户
// @Tags 用户相关api
// @Accept  json
// @Produce json
// @Param Access-Token header string true "Authentication header"
// @Param pageNo query string true "页码"
// @Param pageSize query string true "页大小"
// @Param name query string false "名称"
// @Success 200 {object} utils.JsonContent
// @Failure 400 {object} utils.JsonContent
// @Failure 500 {object} utils.JsonContent
// @Router /api/v1/auth/user [get]
func GetUser(c *gin.Context) {
	pageNoStr := c.Query("pageNo")
	pageSizeStr := c.Query("pageSize")
	name := c.Query("name")
	phone := c.Query("phone")
	openid := c.Query("openid")

	var pageNo, pageSize int
	if !utils.IsStringEmpty(pageNoStr) {
		pageNo = cast.ToInt(pageNoStr)
	}
	if !utils.IsStringEmpty(pageSizeStr) {
		pageSize = cast.ToInt(pageSizeStr)
	}
	paging := &dto.Pagination{
		PageNo:   pageNo,
		PageSize: pageSize,
	}

	d, err := db.GetUserPaging(*paging, name, phone, openid)

	if err != nil {
		utils.EchoError(c, err.Error())
		return
	}
	utils.EchoSuccess(c, d, "请求成功")
	return

}

// GetUserByDeptId
// @Summary 获取根据部门id获取用户（可适用于小程序通讯录）
// @Tags 用户相关api
// @Accept  json
// @Produce json
// @Param Access-Token header string true "Authentication header"
// @Param pageNo query string true "页码"
// @Param pageSize query string true "页大小"
// @Param id query string true "部门ID"
// @Success 200 {object} utils.JsonContent
// @Failure 400 {object} utils.JsonContent
// @Failure 500 {object} utils.JsonContent
// @Router /api/v1/auth/user/getUserByDeptId [get]
func GetUserByDeptId(c *gin.Context) {
	pageNoStr := c.Query("pageNo")
	pageSizeStr := c.Query("pageSize")
	id := c.Query("id")

	var pageNo, pageSize int
	if !utils.IsStringEmpty(pageNoStr) {
		pageNo = cast.ToInt(pageNoStr)
	}
	if !utils.IsStringEmpty(pageSizeStr) {
		pageSize = cast.ToInt(pageSizeStr)
	}
	if utils.IsStringEmpty(id) {
		utils.EchoError(c, "部门id不能为空")
		return
	}
	paging := &dto.Pagination{
		PageNo:   pageNo,
		PageSize: pageSize,
	}

	d, err := db.GetUserByDeptIdPaging(*paging, id)

	if err != nil {
		utils.EchoError(c, err.Error())
		return
	}
	utils.EchoSuccess(c, d, "请求成功")
	return

}

// GetUserByDept
// @Summary 获取用户通讯录（可适用于小程序通讯录）
// @Tags 用户相关api
// @Accept  json
// @Produce json
// @Param Access-Token header string true "Authentication header"
// @Param pageNo query string true "页码"
// @Param pageSize query string true "页大小"
// @Param id query string true "部门ID"
// @Success 200 {object} utils.JsonContent
// @Failure 400 {object} utils.JsonContent
// @Failure 500 {object} utils.JsonContent
// @Router /api/v1/auth/user/getUserByDept [get]
func GetUserByDept(c *gin.Context) {
	pageNoStr := c.Query("pageNo")
	pageSizeStr := c.Query("pageSize")
	id := c.Query("id")

	var pageNo, pageSize int
	if !utils.IsStringEmpty(pageNoStr) {
		pageNo = cast.ToInt(pageNoStr)
	}
	if !utils.IsStringEmpty(pageSizeStr) {
		pageSize = cast.ToInt(pageSizeStr)
	}
	if utils.IsStringEmpty(id) {
		utils.EchoError(c, "部门id不能为空")
		return
	}
	paging := &dto.Pagination{
		PageNo:   pageNo,
		PageSize: pageSize,
	}

	d, err := db.GetUserByDeptPaging(*paging, id)

	if err != nil {
		utils.EchoError(c, err.Error())
		return
	}
	utils.EchoSuccess(c, d, "请求成功")
	return

}

// CreateUser
// @Summary 创建用户
// @Tags 用户相关api
// @Accept  json
// @Produce json
// @Param Access-Token header string true "Authentication header"
// @Param UserRequest body dto.UserRequest true "信息"
// @Success 200 {object} utils.JsonContent
// @Failure 400 {object} utils.JsonContent
// @Failure 500 {object} utils.JsonContent
// @Router /api/v1/auth/user [post]
func CreateUser(c *gin.Context) {
	p := &dto.UserRequest{}
	if err := c.ShouldBindJSON(p); err != nil {
		utils.EchoError(c, "缺少必要参数信息")
		return
	}
	_, _, tag := db.GetUsers(map[string]interface{}{"username": p.Username})
	if tag == "2" {
		utils.EchoError(c, "该账号已存在")
		return
	}
	_, _, tag = db.GetUsers(map[string]interface{}{"email": p.Email})
	if tag == "2" {
		utils.EchoError(c, "该邮箱已存在")
		return
	}
	id, err := middleware.GetCurrentUserId(c)
	if err != nil {
		utils.EchoError(c, err.Error())
		return
	}
	if utils.IsStringEmpty(p.Password) {
		p.Password = utils.Md5V(p.Password)
	} else {
		p.Password = utils.Md5V("123456")
	}
	d, err := db.CreateUser(*p, cast.ToString(id))
	if err != nil {
		utils.EchoError(c, err.Error())
		return
	}
	utils.EchoSuccess(c, d, "创建成功")
	return
}

// UpdateUser
// @Summary 更新单个用户
// @Tags 用户相关api
// @Accept  json
// @Produce json
// @Param Access-Token header string true "Authentication header"
// @Param UserRequest body dto.UserRequest true "信息"
// @Param id path string true "主键ID"
// @Success 200 {object} utils.JsonContent
// @Failure 400 {object} utils.JsonContent
// @Failure 500 {object} utils.JsonContent
// @Router /api/v1/auth/user/{id} [put]
func UpdateUser(c *gin.Context) {
	p := &dto.UserRequest{}
	if err := c.ShouldBindJSON(p); err != nil {
		utils.EchoError(c, "缺少必要参数信息")
		return
	}
	idStr := c.Param("id")
	if utils.IsStringEmpty(idStr) {
		utils.EchoError(c, "缺少用户ID")
		return
	}
	u, _, tag := db.GetUsers(map[string]interface{}{"id": idStr})
	if tag == "0" || tag == "1" {
		utils.EchoError(c, "此用户不存在")
		return
	}

	if utils.IsStringEmpty(p.Password) {
		if u.Password != utils.Md5V(p.Password) {
			p.Password = utils.Md5V(p.Password)
		}
	} else {
		p.Password = utils.Md5V("123456")
	}
	id, _ := middleware.GetCurrentUserId(c)
	d, err := db.UpdateUser(cast.ToUint(idStr), *p, cast.ToString(id))
	if err != nil {
		utils.EchoError(c, err.Error())
		return
	}
	utils.EchoSuccess(c, d, "更新成功")
	return
}

// DeleteUser
// @Summary 删除单个用户
// @Tags 用户相关api
// @Accept  json
// @Produce json
// @Param Access-Token header string true "Authentication header"
// @Param id path string true "主键ID"
// @Success 200 {object} utils.JsonContent
// @Failure 400 {object} utils.JsonContent
// @Failure 500 {object} utils.JsonContent
// @Router /api/v1/auth/user/{id} [delete]
func DeleteUser(c *gin.Context) {
	idStr := c.Param("id")
	if utils.IsStringEmpty(idStr) {
		utils.EchoError(c, "缺少用户ID")
		return
	}
	_, _, tag := db.GetUsers(map[string]interface{}{"id": idStr})
	if tag == "0" || tag == "1" {
		utils.EchoError(c, "此用户不存在")
		return
	}
	_, err := db.DeleteUser(cast.ToUint(idStr))
	if err != nil {
		utils.EchoError(c, err.Error())
		return
	}
	utils.EchoSuccess(c, nil, "删除成功")
	return
}
